package com.ruoyi.common.utils.future;

import com.ruoyi.common.utils.spring.SpringUtils;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.function.Supplier;

/**
 * @Classname FutureUtils
 * @Author: sunluquan
 * @Date: 2021/12/29 15:53
 * @Description TODO
 * 异步相关操作工具类
 */
public class FutureUtils {

    /**
     * 执行相关异步操作
     * @param supplier 供给接口对象
     * @param <T>
     * @return 返回一个供给类型的 CompletableFuture对象
     */
    public static <T> CompletableFuture<T> syncExecute(Supplier<T> supplier){
        return syncExecute(supplier, SpringUtils.getBean(ThreadPoolTaskExecutor.class));
    }

    /**
     * 执行相关异步操作
     * @param supplier 供给接口对象
     * @param executor 线程池
     * @param <T>
     * @return 返回一个供给类型的 CompletableFuture对象
     */
    public static <T> CompletableFuture<T> syncExecute(Supplier<T> supplier, Executor executor){
        return CompletableFuture.supplyAsync(supplier::get, executor);
    }
}
